home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Modules
/
BackSpaceModules
/
Source
/
Stef
/
StefView.m
< prev
next >
Wrap
Text File
|
1993-06-24
|
6KB
|
257 lines
#import "StefView.h"
// this code is copyright Darcy Brockbank, 1993
//
// You may freely reuse and distribute this code in any way shape or
// form, provided that this notice stays intact.
//
// darcy@solutions.ca, samurai@cs.mcgill.ca
// StefView was implemented out of WorldSpaceView and retains some of the
// movement properties...
//
// The code for WorldSpaceView was written by Sam Streeper at NeXT, I think,
// and there were two other contributors, but I can't find their names in the
// source for it.
//
// StefView is the common "Spotlight" screen saver you see on Macs and Windows
// all the time. This is just a quick hack, and can do with vast amounts of
// improvement I'm sure.
//
// If you do improve this thing, send me a copy!
//
// - darcy
@implementation StefView
#define X_PERIOD 15000.0
#define Y_PERIOD 12000.0
#define DEFAULT_FPS 20
#define PI 3.1415926535
#define MAX_IMAGE_WIDTH 256
#define MAX_IMAGE_HEIGHT 256
#define MAX_X_SPEED (26)
#define MAX_Y_SPEED (26)
#define BUFFER_WIDTH (MAX_IMAGE_WIDTH + MAX_X_SPEED + 1)
#define BUFFER_HEIGHT (MAX_IMAGE_HEIGHT + MAX_Y_SPEED + 1)
#define PRINT(a) printf(a)
#define MXSPEEDSLIDER 1000
#define MINX 0.0
#define MINY 50.0
- takeSpot:(float)x:(float)y;
{
NXRect r = {{0.0,0.0},{0.0,0.0}};
NXPoint p = {0.0,0.0};
[spot lockFocus];
[spot getSize:&r.size];
r.origin.x = x;
r.origin.y = y;
[clearSpot composite:NX_COPY toPoint:&p];
[sbuffer composite:NX_DOVER fromRect:&r toPoint:&p];
[spot unlockFocus];
return self;
}
- takeSnapshot;
{
id snapShot;
NXSize screen;
static NXRect imageRect = {{0.0,0.0},{0.0,0.0}};
// NXColor transBlack = NXChangeAlphaComponent(NX_COLORBLACK,0.33);
[NXApp getScreenSize:&screen];
imageRect.size = screen;
snapShot =[[Window alloc] initContent:&imageRect
style:NX_PLAINSTYLE
backing:NX_NONRETAINED
buttonMask:0
defer:NO];
PSsetwindowlevel(NX_MAINMENULEVEL+1,[snapShot windowNum]);
PSsetautofill(NO,[snapShot windowNum]);
[snapShot orderFront:self];
NXPing();
if (!sbuffer) {
sbuffer = [[NXImage alloc] initSize:&screen];
}
[sbuffer lockFocus];
// NXSetColor(transBlack);
// NXRectFill(&imageRect);
PScomposite(0.0,0.0,screen.width,screen.height,[snapShot gState],
0.0,0.0,NX_COPY);
[sbuffer unlockFocus];
snapShot = [snapShot free];
return self;
}
- oneStep
{
NXRect black = {0,0,0,0};
NXRect ballRect;
BRECT new;
int mx, my;
then = now;
now = currentTimeInMs();
my=[speedSlider intValue]; /*KHO*/
/* here is a sleep... This is to safe CUP time. */ /*KHO*/
/* Perhaps not a very good idea? */ /*KHO*/
usleep(my*my/10); /*KHO*/
mx=1+(int)((MAX_X_SPEED*(MXSPEEDSLIDER-my))/MXSPEEDSLIDER); /*KHO*/
my=1+(int)((MAX_Y_SPEED*(MXSPEEDSLIDER-my))/MXSPEEDSLIDER); /*KHO*/
xpos = ((1 + sin(((float)now) / X_PERIOD * 2. * PI))/2.0) /*KHO*/
* maxCoord.x + MINX;
ypos = ((1 + sin(((float)now) / Y_PERIOD * 2. * PI))/2.0) /*KHO*/
* maxCoord.y + MINY;
if (xpos < (old.l - mx)) xpos = old.l - mx;
else if (xpos > (old.l + mx)) xpos = old.l + mx;
if (ypos < (old.b - my)) ypos = old.b - my;
else if (ypos > (old.b + my)) ypos = old.b + my;
new.l = floor(xpos);
new.b = floor(ypos);
new.r = new.l + imageSize.width;
new.t = new.b + imageSize.height;
[self takeSpot:new.l :new.b];
ballRect.origin.x = 0;
ballRect.origin.y = 0;
ballRect.size.width = imageSize.width;
ballRect.size.height = imageSize.height;
redrawTo.x = MIN(new.l, old.l);
redrawTo.y = MIN(new.b, old.b);
redraw.origin.x = 0;
redraw.origin.y = 0;
redraw.size.width = (MAX(new.r, old.r)) - redrawTo.x + 1;
redraw.size.height = (MAX(new.t, old.t)) - redrawTo.y + 1;
black.size= redraw.size;
[buffer lockFocus];
PSsetgray(0);
NXRectFill(&black);
ballTo.x = new.l - redrawTo.x;
ballTo.y = new.b - redrawTo.y;
[spot composite:NX_SOVER fromRect:&ballRect toPoint:&ballTo];
[buffer unlockFocus];
[buffer composite:NX_COPY fromRect:&redraw toPoint:&redrawTo];
old = new;
return self;
}
- initFrame:(const NXRect *)frameRect
{
const char *animSpeed;
NXRect black = {0, 0, BUFFER_WIDTH, BUFFER_HEIGHT };
[super initFrame:frameRect];
[self allocateGState]; // For faster lock/unlockFocus
[self setClipping:NO]; // even faster...
//in this case, I only need one buffer for several Views
if (!(buffer = [NXImage findImageNamed:"worldBuffer"]))
{
buffer = [[NXImage alloc] initSize:&black.size];
[((NXImage *)buffer) setName:"worldBuffer"];
}
if ([buffer lockFocus])
{
PSsetgray(0);
NXRectFill(&black);
[buffer unlockFocus];
}
animSpeed = NXGetDefaultValue([NXApp appName], "animSpeed");
if (animSpeed == NULL) framesPerSecond = DEFAULT_FPS;
else framesPerSecond = atoi(animSpeed);
nextRotationTime = 0;
[self newViewSize];
return self;
}
- sizeTo:(NXCoord)width :(NXCoord)height
{
[super sizeTo:width :height];
[self newViewSize];
return self;
}
- drawSelf:(const NXRect *)rects :(int)count
{
// [sbuffer composite:NX_COPY fromRect:rects toPoint:&(rects->origin)];
return self;
}
- newViewSize
{
//this is called every time View size changes
NXRect black = {0, 0, BUFFER_WIDTH, BUFFER_HEIGHT };
then = now = currentTimeInMs();
if (oldSize.width == bounds.size.width &&
oldSize.height == bounds.size.height)
return self;
else
{
oldSize.width = bounds.size.width;
oldSize.height = bounds.size.height;
}
maxCoord.x = bounds.size.width - imageSize.width - MINX;
maxCoord.y = bounds.size.height - imageSize.height - MINY;
if (maxCoord.x < 0) maxCoord.x = 0;
if (maxCoord.y < 0) maxCoord.y = 0;
old.l = old.r = maxCoord.x/2 + MINX;
old.b = old.t = maxCoord.y/2 + MINY;
ballTo.x = ballTo.y = 0;
if ([buffer lockFocus])
{
PSsetgray(0);
NXRectFill(&black);
[buffer unlockFocus];
}
return self;
}
- (const char *)windowTitle
{
return "StefView";
}
- inspector:sender
{
char buf[MAXPATHLEN];
if (!sharedInspectorPanel){
sprintf(buf,"%s/StefView.nib",[sender moduleDirectory:"Stef"]);
[NXApp loadNibFile:buf owner:self withNames:NO];
if (!spot) {
sprintf(buf,"%s/Spot.tiff",[sender moduleDirectory:"Stef"]);
spot = [[NXImage alloc] initFromFile:buf];
[spot lockFocus];
[spot unlockFocus];
clearSpot = [[NXImage alloc] initFromFile:buf];
[clearSpot lockFocus];
[clearSpot unlockFocus];
[spot getSize:&imageSize];
}
}
[self takeSnapshot];
return sharedInspectorPanel;
}
@end